R可视乎|用R来拼图和排版,告别AI和PS(三)
Editor's Note
继续研究patchwork包。注:小编对原文进行了重新编排和小小的修改
The following article is from 生信交流平台 Author 生信交流平台
1.简介
前面我们已经通过三期的内容来讲解了如何使用R包patchwork来拼图,排版和添加注释信息。
今天我们来聊聊使用patchwork包进行布局和插图。
2.布局
首先我们需要先来了解一下patchwork中的area这个函数
这个函数有四个参数,t和b表示的是网格中上边界和下边界,而l和r表示的是网格中的左边界和右边界。
我们先来结合一个具体的例子来看一下这个函数的具体使用方法
#安装patchwork包
devtools::install_github("thomasp85/patchwork@v1.1.0")
#加载ggplot2和patchwork
library(ggplot2)
library(patchwork)
#定义三个区域
layout <- c(
#如果只写两个参数,那么b = t, r = l
area(1, 1),
#写三个参数,那个r = l
area(1, 3, 3),
area(3, 1, 3, 2)
)
#画出三个区域
plot(layout)
可以看到这是一个3*3的九宫格,第一个区域top和left都是1,bottom和right也都是1,所以在左上角第一个小格子里。第二个区域top是1,left是3,bottom和right都是3,所以对应的区域是图中绿色区域。依此类推,大家可以自己推导一下第三个区域是不是蓝色所显示的区域。
了解了area这个函数以后,我们利用前几次展示的数据来看看如何布局。
#图1 散点图
p1 <- ggplot(mtcars) +
geom_point(aes(mpg, disp)) +
ggtitle('plot1')
#图2 箱型图
p2 <- ggplot(mtcars) +
geom_boxplot(aes(gear, disp, group = gear)) +
ggtitle('plot2')
#图3 拟合曲线
p3 <- ggplot(mtcars) +
geom_smooth(aes(hp, wt)) +
ggtitle('plot3')
#图4 柱形图
p4 <- ggplot(mtcars) +
geom_bar(aes(gear)) +
facet_wrap(~cyl) +
ggtitle('plot4')
#图5 histogram
p5 <- ggplot(mtcars) +
geom_histogram(aes(mpg)) +
ggtitle('plot5')
#采用上面构建的layout来展示p1,p1和p3
p1 + p2 + p3 + plot_layout(design = layout)
是不是跟上面的布局一样,只是用我们自己的plot1,plot2和plot3来替换了原来的红,绿和蓝三个色块。
可能有些读者觉得,这个坐标有点晕,那么接下来给大家介绍一个更加简单直白的layout设置方法,可以达到相同的效果。
layout <- "
##BBBB
AACCDD
##CCDD
"
#这里plot的顺序跟上面的A,B,C和D相对应
p1 + p2 + p3 + p4 +
plot_layout(design = layout)
其实,这也是一个九宫格,你可以细品一下。plot2对应B的位置,占第一行,第二三列。其他依此类推。
其实这里的layout写成下面的格式是一样的效果,大家可以体会一下这两种写法的区别。实际上上面那种写法,对应的是一个3*6的网格,而下面这种写法对应的是3*3的网格。
layout <- "
#BB
ACD
#CD
"
p1 + p2 + p3 + p4 +
plot_layout(design = layout)
接下来大家就可以自由发挥啦,
layout <- '
##A
#B#
C##
'
wrap_plots( p1, p2, p3, design = layout)
比如说这种对角线排布
layout <- '
A#B
#E#
C#D
'
#注意这里的对应关系
wrap_plots(A= p3, B=p5, C=p2, D=p1,E=p4, design = layout)
还有这种“众星捧月”的形式
3.插图
有两种方法可以实现插图的效果。
3.1方法一:利用layout来实现
#重叠
layout <- c(
area(t = 2, l = 1, b = 5, r = 4),
area(t = 1, l = 3, b = 3, r = 5)
)
plot(layout)
接下来,我们替换成自己的两张图片
p1 + p2 +
plot_layout(design = layout)
当然也可以将图B完全插入到图A内部,先来看看效果图
#在图A右上角插入图B
layout <- c(
area(t = 1, l = 1, b = 8, r = 8),
area(t = 1, l = 6, b = 3, r = 8)
)
plot(layout)
再来看看实际结果
p1 + p2 +
plot_layout(design = layout)
3.2方法二:使用inset_element()
函数
#默认align_to为panel,只包含绘图区域
#这里的left,bottom,right,top都是按百分比计算
p1 + inset_element(p2, left = 0.6, bottom = 0.6, right = 1, top = 1)
注意inset_element
有一个参数叫align_to
,默认值是"panel",你可以看到图B完全在图A的绘图区域里面。下面我们再来看看,如果把这里的align_to
设置成"full"会是什么效果。
#aligan_to设置为full,会包含margin区域
p1 + inset_element(p2, left = 0.6, bottom = 0.6, right = 1, top = 1,
align_to = 'full')
我们可以看到当align_to = 'full'
的时候,这里考虑到了图A的边界区域,就是写标题"A"的区域,跟上面一张图对比,你就会发现其中的区别。
理解了这里的参数之后,想把图B插入到图A的左下角也很容易
#左下角
p1 + inset_element(p2, left = 0, bottom = 0, right = 0.6, top = 0.5)
当然,我们还可以人为定义边距的大小
#图B的上边和右边各留出1cm
p1 + inset_element(
p2,
left = 0.5,
bottom = 0.5,
right = unit(1, 'npc') - unit(1, 'cm'),
top = unit(1, 'npc') - unit(1, 'cm')
)
到这里,我们对patchwork这个包的讲解就全部结束了,希望对大家有所帮助!
拓展
如果想进一步学习,可以参考以下几篇其他公众号的推文以及他的官网[1],Rdocumentation[2]以及PDF教程[3]
参考资料
官网: https://www.rdocumentation.org/packages/patchwork/versions/1.1.1
[2]Rdocumentation: https://patchwork.data-imaginist.com/articles/patchwork.html
[3]PDF教程: https://www.bing.com/search?q=patchwork%20r&qs=n&form=QBRE&sp=-1&pq=patchwork%20&sc=8-10&sk=&cvid=5B39EB1F695F44D1980802D51846501E